package xeroxware.web.common.service.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import xeroxware.web.common.service.CommonQueryService;

/**
 * <pre>
 * CommonQueryServiceImpl
 * </pre>
 * 
 * @since 2013. 1. 2.
 * @author XEROXER
 */
@Service
public class CommonQueryServiceImpl implements CommonQueryService {

	@Autowired
	private CommonQueryDAO commonQueryDAO;

	/**
	 * 리스트를 조회한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return 조회 결과
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectList(String sqlId) throws Exception {
		return commonQueryDAO.selectList(sqlId);
	}

	/**
	 * 리스트를 조회한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return 조회 결과
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectList(String sqlId, Object parameter) throws Exception {
		return commonQueryDAO.selectList(sqlId, parameter);
	}

	/**
	 * 단건을 조회한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return 단건 조회 결과
	 * @throws Exception
	 */
	public Object selectOne(String sqlId) throws Exception {
		return commonQueryDAO.selectOne(sqlId);
	}

	/**
	 * 단건을 조회한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return 단건 조회 결과
	 * @throws Exception
	 */
	public Object selectOne(String sqlId, Object parameter) throws Exception {
		return commonQueryDAO.selectOne(sqlId, parameter);
	}

	/**
	 * 부분 범위 리스트를 조회한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param pageIndex
	 *            현재 페이지 번호
	 * @param pageSize
	 *            한 페이지 조회 수
	 * @return 부분 범위 조회 결과
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectListWithPaging(String sqlId, int pageIndex, int pageSize) throws Exception {
		return commonQueryDAO.selectListWithPaging(sqlId, pageIndex, pageSize);
	}

	/**
	 * 부분 범위 리스트를 조회한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @param pageIndex
	 *            현재 페이지 번호
	 * @param pageSize
	 *            한 페이지 조회 수
	 * @return 부분 범위 조회 결과
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectListWithPaging(String sqlId, Object parameter, int pageIndex, int pageSize)
			throws Exception {
		return commonQueryDAO.selectListWithPaging(sqlId, parameter, pageIndex, pageSize);
	}

	/**
	 * 입력을 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return insert 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int insert(String sqlId) throws Exception {
		return commonQueryDAO.insert(sqlId);
	}

	/**
	 * 입력을 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return insert 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int insert(String sqlId, Object parameter) throws Exception {
		return commonQueryDAO.insert(sqlId, parameter);
	}

	/**
	 * 다건 입력을 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param list
	 *            SQL mapping 입력 데이터를 List 형식으로 다건 세팅한 파라메터
	 * @return insert 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int insertRecordset(String sqlId, List<?> list) throws Exception {
		return commonQueryDAO.insertRecordset(sqlId, list);
	}

	/**
	 * 수정을 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return update 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int update(String sqlId) throws Exception {
		return commonQueryDAO.update(sqlId);
	}

	/**
	 * 수정을 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return update 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int update(String sqlId, Object parameter) throws Exception {
		return commonQueryDAO.update(sqlId, parameter);
	}

	/**
	 * 다건 수정을 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param list
	 *            SQL mapping 입력 데이터를 List 형식으로 다건 세팅한 파라메터
	 * @return update 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int updateRecordset(String sqlId, List<?> list) throws Exception {
		return commonQueryDAO.updateRecordset(sqlId, list);
	}

	/**
	 * 삭제를 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return delete 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int delete(String sqlId) throws Exception {
		return commonQueryDAO.delete(sqlId);
	}

	/**
	 * 삭제를 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return delete 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int delete(String sqlId, Object parameter) throws Exception {
		return commonQueryDAO.delete(sqlId, parameter);
	}

	/**
	 * 다건 삭제를 처리한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param list
	 *            SQL mapping 입력 데이터를 List 형식으로 다건 세팅한 파라메터
	 * @return delete 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int deleteRecordset(String sqlId, List<?> list) throws Exception {
		return commonQueryDAO.deleteRecordset(sqlId, list);
	}

	/**
	 * 레코드의 상태(_ROW_TYPE)별로 입력/수정/삭제를 처리한다.
	 * 
	 * @param insertId
	 *            Insert SQL mapping 쿼리 ID
	 * @param updateId
	 *            Update SQL mapping 쿼리 ID
	 * @param deleteId
	 *            Delete SQL mapping 쿼리 ID
	 * @param list
	 *            SQL mapping 입력 데이터를 List 형식으로 다건 세팅한 파라메터
	 * @return 처리결과 count
	 * @throws Exception
	 */
	@Transactional
	public int save(String insertId, String updateId, String deleteId, List<Map<String, Object>> list) throws Exception {

		int iCount = 0;

		for (Map<String, Object> map : list) {
			if ("I".equals(map.get("_ROW_TYPE"))) {
				iCount += commonQueryDAO.insert(insertId, map);
			} else if ("U".equals(map.get("_ROW_TYPE"))) {
				iCount += commonQueryDAO.update(updateId, map);
			} else if ("D".equals(map.get("_ROW_TYPE"))) {
				iCount += commonQueryDAO.delete(deleteId, map);
			}
		}

		return iCount;
	}
}
